﻿#pragma once
#ifndef WRWORKSESSION_H
#define WRWORKSESSION_H

#include "WRWorkDomain.h"
#include "WRWorkObjectCollection.h"

//表示工作对象类。
class WRWorkObject;

//表示工作会话。
class WRSOFT_WORKING_COMMON_CLASS WRWorkSession
{
private:
    //引用计数。
    QAtomicInt m_refCnt;
    //所属工作域。
    WRWorkDomain* m_domain;
    //工作对象集合。
    WRWorkObjectCollection m_objects;

    //禁用复制构造函数和赋值操作符。
    Q_DISABLE_COPY(WRWorkSession)

protected:
    //设置工作对象集合。
    inline void setObjects(const WRWorkObjectCollection& value)
    {
        m_objects = value;
    }
    //设置工作对象集合。
    inline void setObjects(const QList<WRWorkObject*>& value)
    {
        m_objects = WRWorkObjectCollection(value);
    }
    //设置工作对象集合。
    inline void setObjects(const WRArray<WRWorkObject*>& value)
    {
        m_objects = WRWorkObjectCollection(value);
    }

    //初始化工作域。
    WRWorkSession(WRWorkDomain* domain);
    //释放当前对象所占用的相关资源。
    virtual ~WRWorkSession();

public:
    //添加对象引用。
    void addRef(void);
    //释放对象引用, 如果引用计数为0，则删除对象，返回True，否则返回False。
    bool release(void);

    //获取当前会话所属的工作域。
    inline WRWorkDomain* domain(void) const
    {
        return m_domain;
    }
    //获取当前会话所属的工作进程。
    inline WRWorkDaemon* daemon(void) const
    {
        return m_domain->daemon();
    }

    //获取工作对象集合。
    inline const WRWorkObjectCollection& objects(void) const
    {
        return m_objects;
    }
    //获取指定类型的对象集合。
    inline const WRArray<WRWorkObject*>& filterObjects(const QUuid& tuid) const
    {
        return m_objects.filter(tuid);
    }
    //获取指定类型的对象集合。
    inline const WRArray<WRWorkObject*>& filterObjects(WRType* type = 0) const
    {
        return m_objects.filter(type);
    }
};

#endif // WRWORKSESSION_H
